package oto

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-resty/resty/v2"
)

// Set 设置需要上传的“代号”和操作,方便另一边后端进行访问
func (r *gusinx) Set(index string, tools HandleMessage) {
	r.R.GET("/oto/"+index, LimitRequestBody(300), func(c *gin.Context) {
		date := c.Query("date")
		d, err := decrypt(date)
		if err != nil {
			c.JSON(200, gin.H{"date": "双方密钥不互通"})
		}
		ans := tools(d)
		back, err2 := encrypt(ans)
		if err2 != nil {
			c.JSON(200, gin.H{"date": "对方加密失误"})
		}
		c.JSON(200, gin.H{"date": back})

	})
}

// Set32keys 设置双方伪https加密密钥需要两边同步
func (r *gusinx) Set32keys(keys string) error {
	err := set32Key(keys)
	if err != nil {
		return err
	}
	return nil
}

// PowerSet 这个函数具有强大的处理能力能够动态解析任意json，无需提定义格式，因此会消耗更多性能。我们会传给您一个解析好的map[string] string类型数据，您可可以对其操作后返回一个map[string] string
func (r *gusinx) PowerSet(index string, tools PowerHandle) {
	r.R.POST("/oto/"+index, LimitRequestBody(300), func(c *gin.Context) {
		var date map[string]string
		if err := c.ShouldBindJSON(&date); err != nil {
			// 如果解析失败，返回错误
			c.JSON(200, gin.H{"error": "无效的 JSON 格式"})
			return
		}
		var er error
		for key, _ := range date {
			date[key], er = decrypt(date[key])
			if er != nil {
				c.JSON(200, gin.H{"error": "解压出现错误请检查密钥和格式"})
				return
			}
		}
		ans := tools(date)
		for key, _ := range ans {
			ans[key], er = decrypt(ans[key])
			if er != nil {
				c.JSON(200, gin.H{"error": "加密出现错误请检查密钥和格式"})
				return
			}
		}
		c.JSON(200, ans)
	})
}

// Get 获取string类型数据从数据端
func (r *gusinx) Get(index string, date string) (string, error) {
	url := "http://" + r.ip + "/oto/" + index
	if r.c == nil {
		r.c = resty.New()
	}
	d, err := encrypt(date)
	if err != nil {
		return "nil", fmt.Errorf("加密失败")
	}

	resp, err := r.c.R().
		SetQueryParams(map[string]string{"date": d}).
		Get(url)

	if err != nil {
		return "nil", fmt.Errorf("后端通信失败")
	}
	var sh struct {
		Date string `json:"date"`
	}
	if err := json.Unmarshal(resp.Body(), &sh); err != nil {
		return "nil", fmt.Errorf("json格式化失败")
	}
	ff,err1 := decrypt(sh.Date)
	if err1 != nil {
		return "nil", fmt.Errorf("解密失败")
	}
	return ff, nil
}
func (r *gusinx) PowerGet(index string, date map[string]string) (map[string]interface{}, error) {
	url := "http://" + r.ip + "/oto/" + index
	if r.c == nil {
		r.c = resty.New()
	}
	for key, _ := range date {
		date[key], _ = encrypt(date[key])
	} //加密
	res, err := r.c.R().
		SetBody(date).
		Post(url)
	if err != nil {
		return nil, err
	}
	var sh map[string]interface{}
	err1 := json.Unmarshal(res.Body(), &sh)
	if err1 != nil {
		return nil, err1
	}
	return sh, nil
}
